home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / msh-156.lha / han / hancrtso.a < prev    next >
Text File  |  1996-12-22  |  9KB  |  382 lines

  1. ; $Id: hancrtso.a,v 1.56 1996/12/22 00:22:33 Rhialto Rel $
  2. ; $Log: hancrtso.a,v $
  3. ; Revision 1.56  1996/12/22  00:22:33  Rhialto
  4. ; Add private BeginIO().
  5. ;
  6. ; Revision 1.55  1993/12/30  23:02:45  Rhialto
  7. ; *** empty log message ***
  8. ;
  9. ; Revision 1.54  1993/06/24  05:12:49  Rhialto
  10. ; DICE 2.07.54R.
  11. ;
  12. ; Revision 1.53  92/10/25  02:21:25  Rhialto
  13. ; No change.
  14. ; Revision 1.51  92/04/17  15:34:37  Rhialto
  15. ; Freeze for MAXON.
  16. ; Revision 1.46  91/10/06  18:25:52  Rhialto
  17. ;
  18. ; Freeze for MAXON
  19. ;
  20. ; Revision 1.43  91/09/28  01:46:54  Rhialto
  21. ; Create regargs entrypoints for byte swap routines.
  22. ;
  23. ; Revision 1.42  91/06/14  00:07:56  Rhialto
  24. ; DICE conversion
  25. ;
  26. resident    equ 1    ; Do we handle RESIDENT (== pure) code?
  27. ;        near a4 ; for A68k 2.7.1: also needs -m32766 for offset
  28.         ;   C.A
  29.         ;
  30.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  31.         ;
  32.         ;   Amiga startup code for non-resident and resident DCC
  33.         ;   programs.
  34.         ;
  35.         ;   Modified for use with a DOS handler.
  36.         ;
  37.         ;   DLINK:
  38.         ;
  39.         ;   * __BSS_LEN   : # long wrds of bss (occurs after DATA)
  40.         ;   * __DATA_LEN  : # long wrds of initialized data to copy (if resident)
  41.         ;   * __DATA_BAS  : base of data (read only if resident)
  42.         ;   * __RESIDENT  : is this code residentable?    If this variable
  43.         ;            is set then there are no absolute data/bss
  44.         ;            references except __DATA_BAS and there is
  45.         ;            NO BSS MEMORY ALLOCATED AFTER THE DATA
  46.         ;            SECTION.
  47.         ;
  48.         ;            If this variable is not set then absolute
  49.         ;            references refer to the same storage as
  50.         ;            A4 relative accesses and uninitialized
  51.         ;            BSS space exists just after the data section.
  52.         ;
  53.         ;            Note that in the large-data model + fragmented
  54.         ;            sections, there are usually real BSS hunks
  55.         ;            floating about that have been zerod by
  56.         ;            LoadSeg() (in this case __BSS_LEN could be 0)
  57.         ;
  58.         ;   COMPILER:
  59.         ;
  60.         ;   * If -r option specified when compiling then the compiler
  61.         ;     will generate autoinit code to handle data initialization
  62.         ;     that would otherwise require a reloc32 hunk.
  63.         ;
  64.         ;   * If -r or -md specified compiler references all data items
  65.         ;     using A4-Relative addressing.
  66.         ;
  67.         ;   C LIB CODE:
  68.         ;
  69.         ;   * Resident: Allocate (__DATA_LEN+__BSS_LEN)*4
  70.         ;     Not Res : zero out preallocated BSS.
  71.         ;
  72.         ;   * Generate A4 ref ptr to bss base + 32766 (uses Aztec's
  73.         ;     conventions).
  74.         ;
  75.         ;   * All library code uses the SMALL-DATA with alternate
  76.         ;     BSS and DATA section names (based in this source
  77.         ;     file) so the linker puts library related data/bss
  78.         ;     first.  BUT, BSS always comes after DATA unless
  79.         ;     you -frag the link (can't resident a frag'd link),
  80.         ;     so if there is more than 64KBytes of *initialized*
  81.         ;     data you must -frag the link.
  82.  
  83.         section text,code
  84.  
  85.         xref    __RESIDENT        ; (dlink), executable is residentable
  86.         xref    __BSS_LEN        ; (dlink), length of BSS
  87.         xref    __DATA_BAS        ; (dlink), base of initialized data
  88.         xref    __DATA_LEN        ; (dlink), length of data
  89.  
  90.         xref    _messydoshandler    ; we call messydoshandler()
  91.  
  92.         xref    _LVOSetSignal
  93.         xref    _LVOAllocMem
  94.         xref    _LVOFreeMem
  95.         xref    _LVOForbid
  96.         xref    _LVOReplyMsg
  97.  
  98.         xdef    _exit            ; we are exit()
  99.         xdef    start
  100.         xdef    _SysBase        ; we export _SysBase
  101. ;        xdef    __WBMsg
  102.  
  103. MEMF_CLEAR    equ    $00000001
  104. MEMF_PUBLIC    equ    $00010000
  105.  
  106. start:
  107. ;        movem.l D2-D7/A2-A6,-(sp)
  108.  
  109.         move.l    4,A6            ; EXEC base
  110.  
  111.         move.l    sp,A2
  112. ;        move.l    A0,-(sp)            ; save arg for _main() call
  113. ;        move.l    D0,-(sp)            ; save arglen for _main() call
  114.  
  115.         ;   If we are flagged resident then there is NO BSS ALLOCATED
  116.         ;   If we are not flagged resident then BSS IS ALLOCATED AFTER DATA,
  117.         ;    BUT NOT CLEARED.
  118.  
  119.         ;ifne resident
  120.         move.w    #__RESIDENT,D0
  121.         beq    snotres
  122.  
  123.         ;   Allocate BSS+DATA space and then copy static data.
  124.  
  125.         move.l    #__BSS_LEN,D0
  126.         add.l    #__DATA_LEN,D0
  127.         asl.l    #2,D0            ; x4
  128.         addq.l    #8,D0            ; MemList header extra
  129.         move.l    D0,D5            ; D5 = #bytes
  130.         move.l    #MEMF_PUBLIC,D1
  131.         jsr    _LVOAllocMem(A6)
  132.         tst.l    D0
  133.         bne    alok
  134.         move.l    A2,sp
  135.         moveq.l #-1,D0
  136.         bra    exfail
  137.  
  138. alok        move.l    D0,A0
  139.         clr.l    (A0)+               ; MemList entry next ptr
  140.         move.l    D5,(A0)+            ; MemList entry #bytes
  141.         lea    32766(A0),A4        ; SET A4
  142.         lea    -8(A0),A3           ; A3 = MemList entry base
  143.                         ; can't copy to MemList(A4) yet
  144.  
  145.  
  146.         ;   Copy data to allocated copy
  147.  
  148.                         ; A0 = dst
  149.         lea    __DATA_BAS,A1        ; A1 = src
  150.         move.l    #__DATA_LEN,D0        ; D0 = long words
  151.         bra    bssent
  152. bsslop        move.l    (A1)+,(A0)+
  153. bssent        dbf    D0,bsslop
  154.         sub.l    #$10000,D0
  155.         bcc    bsslop
  156.         bra    clrbss
  157.         ;endc
  158.  
  159.  
  160.         ;   Not resident, BSS space has been allocated for us
  161.         ;   beyond the specified data, just load the base ptr
  162.  
  163. snotres     lea    __DATA_BAS,A4
  164.         lea    32766(A4),A4
  165.         sub.l    A3,A3
  166.  
  167. clrbss
  168.         ;   CLEAR BSS    &-32766(A4) + __DATA_LEN*4
  169.  
  170.         lea    -32766(A4),A0
  171.         move.l    #__DATA_LEN,D0
  172.         asl.l    #2,D0
  173.         add.l    D0,A0
  174.  
  175.         move.l    #__BSS_LEN,D0        ; longwords of bss
  176.         moveq.l #0,D1
  177.         bra    clrent
  178. clrlop        move.l    D1,(A0)+
  179. clrent        dbf    D0,clrlop
  180.         sub.l    #$10000,D0
  181.         bcc    clrlop
  182.  
  183.         ;ifne resident
  184.         move.l    A3,___MemList(A4)   ; memlist entry (if resident)
  185.         ;endc
  186.         move.l    A2,__ExitSP(A4)     ; sp to restore
  187.  
  188. ;        moveq.l #0,D0            ; new signals
  189. ;        move.l    #$1000,D1        ; signal mask
  190. ;        jsr    _LVOSetSignal(A6)   ; clear ^C
  191.  
  192.         move.l    A6,_SysBase(A4)     ; resident segment.
  193.  
  194.         ;   Return value of 0 indicates succcess.  Flags
  195.         ;   have been set.
  196.  
  197.         ;ifne resident
  198.         jsr    __AutoInit0        ; A6 has SYSBase
  199.         bne    xfail
  200. ;        pea    1.W            ; autoconfig loader
  201. ;        jsr    __AutoConfig        ; note, rt pulls stack
  202. ;        addq.l    #4,sp
  203.         jsr    __AutoInit1        ; A6 has SYSBase
  204.         bne    xfail
  205.         ;endc
  206.         jsr    _messydoshandler(PC)
  207.  
  208.         ;   fall through to low level exit... this avoids referencing
  209.         ;   exit() if the user overides messydoshandler().
  210.  
  211. xfail
  212.         clr.l    -(sp)
  213.         clr.l    -(sp)
  214.  
  215.         ;   _EXIT()
  216.         ;
  217.         ;   since entry uses malloc we must free any incidental memory
  218.         ;   at __exit instead of _exit.
  219.         ;
  220.         ;   ReplyMsg(_WBMsg) just before returning
  221.  
  222. _exit:
  223. ;        pea    -1.W
  224. ;        jsr    __AutoConfig        ; note, rt pulls stack
  225. ;        addq.l    #4,sp
  226.         move.l    _SysBase(A4),A6
  227.         ;ifne resident
  228.         jsr    __AutoExit1        ; A6 has SysBase
  229.         jsr    __AutoExit0        ; A6 has SysBase
  230.         ;endc
  231.  
  232.         move.l    __ExitSP(A4),A5     ; get sp... because we might free
  233.                         ; the space taken by the variable!
  234.  
  235. ;        move.l    __WBMsg(A4),D6      ; D6 = WBMsg if it exists
  236.  
  237.         ;ifne resident
  238.         move.l    ___MemList(A4),D0   ; free memory
  239.         beq    ex20
  240. ex10        move.l    D0,A2
  241.         move.l    (A2),A3             ; next...
  242.  
  243.         move.l    4(A2),D0            ; bytes
  244.         move.l    A2,A1            ; ptr
  245.         jsr    _LVOFreeMem(A6)
  246.  
  247.         move.l    A3,D0            ; next...
  248.         bne    ex10
  249.         ;endc
  250. ex20
  251.  
  252.         move.l    4(sp),D0            ; get exit code
  253.         move.l    A5,sp            ; restore sp
  254.  
  255. ;        tst.l    D6            ; reply to workbench msg if it
  256. ;        beq    ex30            ; exists
  257. ;        jsr    _LVOForbid(A6)      ; forbid through exit
  258. ;        move.l    D6,A1
  259. ;        jsr    _LVOReplyMsg(A6)
  260.  
  261. ex30
  262.         ;   FINIS, poof.
  263.  
  264. exfail
  265. ;        movem.l (sp)+,D2-D7/A2-A6
  266.         rts
  267.  
  268.  
  269.         ;   Base of autoinit section
  270.  
  271.         ;ifne resident
  272.         section autoinit0,code
  273. __AutoInit0:
  274.         section autoinit1,code
  275. __AutoInit1:
  276.         section autoexit0,code
  277. __AutoExit0:
  278.         section autoexit1,code
  279. __AutoExit1:
  280.         ;endc
  281. ;        section autoconfig,code
  282. ;__AutoConfig:
  283.  
  284.  
  285.         ;   All library C code is compiled with the -S option
  286.         ;   which uses 'libdata' and 'libbss' section names,
  287.         ;   forcing library data to come before program data
  288.         ;   and library bss to come before program bss (because
  289.         ;   library data/bss sections are declared here first
  290.         ;   and sections of like name are coagulated).
  291.  
  292.         section libdata,data
  293. _Reserved    dc.l    0        ; force section to exist (dummy)
  294.  
  295.         section libbss,bss
  296.  
  297. _SysBase    ds.l    1
  298. __ExitSP    ds.l    1
  299. ;__WBMsg    ds.l    1
  300.         ;ifne resident
  301.         xdef    ___MemList    ; used by malloc/free
  302. ___MemList    ds.l    1
  303.         ;endc
  304.  
  305. ;;;;
  306. ;
  307. ; Some byte-swapping routines for extra bonus points.
  308. ;
  309. ; word Get8086Word(A0 byte *Word8086);
  310. ; word OtherEndianWord(D0 long oew);    /* long should become word */
  311. ; ulong OtherEndianLong(D0 ulong oel);
  312. ;
  313.  
  314.     section text,code
  315.  
  316.     xdef _Get8086Word
  317.     xdef @Get8086Word
  318. _Get8086Word:
  319.     move.l    4(sp),a0        ; get (unaligned) address
  320. @Get8086Word:
  321.     move.b    (a0)+,d1        ; get low order byte
  322.     move.b    (a0),d0         ; get high order byte
  323.     asl.w    #8,d0        ; shift it into position
  324.     move.b    d1,d0        ; put in the low order byte
  325.     rts
  326.  
  327.     xdef _OtherEndianWord
  328.     xdef @OtherEndianWord
  329. _OtherEndianWord:
  330.     move.w    4+2(sp),d0      ; arg is passed as a long for now
  331. @OtherEndianWord:
  332.     rol.w    #8,d0
  333.     rts            ; we leave junk in the high word of d0.
  334.  
  335.     xdef _OtherEndianLong
  336.     xdef @OtherEndianLong
  337. _OtherEndianLong:
  338.     move.l    4(sp),d0
  339. @OtherEndianLong:
  340.     rol.w    #8,d0
  341.     swap    d0
  342.     rol.w    #8,d0
  343.     rts
  344.  
  345. ;;;;
  346. ;
  347. ; Glue for the disk change interrupt handler. A4 is now in A1 (is_Data).
  348. ; We only need this when we compile for PURE code, but it won't harm
  349. ; either.
  350.  
  351.     xref _ChangeIntHand
  352.     xdef _ChangeIntHand0
  353. _ChangeIntHand0:
  354.     move.l    a4,-(sp)
  355.     movea.l a1,a4
  356.     jsr    _ChangeIntHand    ; C code
  357.     move.l    (sp)+,a4
  358.     rts
  359.  
  360.         ;   BeginIO(ior)
  361.  
  362.         section text,code
  363.  
  364.         xdef    _hyper_BeginIO
  365.         xdef    _BeginIO
  366.         xdef    @BeginIO
  367.  
  368. _hyper_BeginIO:
  369. _BeginIO:
  370.         move.l    4(sp),A0
  371. @BeginIO:
  372.         move.l    A6,-(sp)
  373.         move.l    A0,A1
  374.         move.l    $14(A0),A6   ; io_Device
  375.         jsr    -30(A6)
  376.         move.l    (sp)+,A6
  377.         rts
  378.  
  379.     END
  380.